package eu.floranet.arquivo.temp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.InvalidPropertiesFormatException;
import java.util.Map;
import java.util.Properties;

import eu.floranet.arquivo.utils.Base64;

/**
 * Classe de construção do ficheiro e parametros da base de dados. Esta classe
 * constroi um ficheiro xml com as propriedades da base de dados. Depois da
 * construção e existencia do ficheiro de parametros retorna os valores numa
 * lista mapeada.
 * 
 * @author jmark
 * 
 */
public class EclipseLinkProperties {

	private Properties prop = null;
	private File propFile = null;
	private FileOutputStream fos = null;

	/**
	 * Método de default de construção da classe.
	 */
	public EclipseLinkProperties() {
		this.setProperties();
	}

	private void setProperties() {
		this.prop = new Properties();
		this.propFile = new File("database.xml");
	}

	/**
	 * Método de introdução de parametros no ficheiro de configuração da base de
	 * dados.
	 * 
	 * @param server
	 *            - String
	 * @param porta
	 *            - int
	 * @param database
	 *            - String
	 * @param user
	 *            - String
	 * @param pass
	 *            - String
	 * @return boolean
	 */
	public boolean addProperties(String server, int porta, String database,
			String user, String pass) {
		if ((server != null) && (porta > 0) && (database != null)
				&& (user != null)) {
			this.prop.setProperty("server", server);
			this.prop.setProperty("porta", Integer.toString(porta));
			this.prop.setProperty("database", database);
			this.prop.setProperty("user", user);
			this.prop.setProperty("pass", Base64.encodeObject(pass, Base64.GZIP
					| Base64.DONT_BREAK_LINES));

			try {
				this.fos = new FileOutputStream("database.xml");
				this.prop.storeToXML(this.fos, "Database");
				this.fos.close();
				return true;
			} catch (FileNotFoundException e) {
				e.printStackTrace();
				return false;
			} catch (IOException e) {
				e.printStackTrace();
				return false;
			}
		} else {
			return false;
		}
	}

	/**
	 * Método de verificação da existencia do ficheiro de parametros da base de
	 * dados.
	 * 
	 * @return boolean
	 */
	public boolean existPropertiesFile() {
		if (this.propFile.exists()) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * Método de construção de parametros da base de dados numa lista mapeada.
	 * 
	 * @return Map<String, Object>
	 * @throws InvalidPropertiesFormatException
	 * @throws IOException
	 */
	public Map<String, Object> getProperties()
			throws InvalidPropertiesFormatException, IOException {
		Map<String, Object> properties = new HashMap<String, Object>();

		if (existPropertiesFile()) {
			FileInputStream fis = new FileInputStream(this.propFile);
			this.prop.loadFromXML(fis);

			properties.put("eclipselink.logging.level", "FINE");
			properties.put("eclipselink.jdbc.driver", "com.mysql.jdbc.Driver");
			properties.put("eclipselink.jdbc.url", "jdbc:mysql://"
					+ this.prop.getProperty("server") + ":"
					+ this.prop.getProperty("porta") + "/"
					+ this.prop.getProperty("database") + "");
			properties.put("eclipselink.jdbc.user", this.prop
					.getProperty("user"));
			properties.put("eclipselink.jdbc.password", (String) Base64
					.decodeToObject(this.prop.getProperty("pass")));

			return properties;
		} else {
			return properties;
		}
	}

}
